/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package spaceinvaders;

import Util.Alien;
import Util.Aliens;
import Util.Drawable;
import Util.Musica;
import Util.Nave;
import java.util.ArrayList;
import javazoom.jl.decoder.JavaLayerException;

/**
 *
 * @author Lucas
 */
public class Func {
    //Os estados do jogo (introdução, jogo e tela de recordes)
    public static final int stateIntro = 0;
    public static final int stateJogo = 1;
    public static final int stateRecorde = 2;
    public static final int statePerdeu = 3;
    public static final int stateGanhou = 4;

    //O estado atual do jogo, a pontuação do jogador e suas vidas
    int state, pontos = 0;
    //Músicas
    Musica player, oitomil;
    //Variáveis de controle: se o som de easter egg foi tocado, se o jogo
    //está pausado e se o jogador preencheu o nome quando faz um recorde
    boolean oitomiltocou, paused, preencheu;
    //Nave que o usuário irá controlar
    Nave nave = null;
    //Os aliens do jogo
    Aliens aliens = null;
    //Objetos que devem ser desenhados no jogo
    ArrayList<Drawable> desenhos = null;
    //Painel gráfico do jogo
    Graficos graficos = null;
    
    public Func() throws JavaLayerException {
        desenhos = new ArrayList<Drawable>();
        player = new Musica();
        oitomil = new Musica();
        nave = new Nave("Nave", 297, 447, this);
        aliens = new Aliens(nave.getTiros(), this);
        nave.setTiroal(aliens.getTiroal());
        paused = false;
        preencheu = false;
        graficos = new Graficos(desenhos, this);
        state = stateIntro;
    }

    // <editor-fold defaultstate="collapsed" desc="Iniciar estados">
    //Iniciar o estado de introdução do jogo
    public void initIntro() {
        paused = false;
        state = stateIntro;
        desenhos.remove(nave);
        desenhos.remove(aliens);
        pontos = 0;
        oitomiltocou = false;
        preencheu = false;
    }

    //Iniciar o estado do jogo
    public void initJogo() {
        paused = false;
        pontos = 0;
        nave.reset();
        aliens.reset();
        aliens.setNivel(1);
        Alien.velocidade = 3;
        Alien.staticy = 0;
        desenhos.add(nave);
        desenhos.add(aliens);
        state = stateJogo;
    }

    //Iniciar o estado da tela de recordes do jogo
    public void initRecorde() {
        state = stateRecorde;
        desenhos.remove(nave);
        desenhos.remove(aliens);
    }
    
    //Iniciar o estado da tela de quando o jogador perde o jogo
    public void initPerdeu(){
        state = statePerdeu;
        desenhos.remove(nave);
        desenhos.remove(aliens);
    }
    
    //Iniciar o estado da tela de quando o jogador ganha o jogo
    public void initGanhou(){
        state = stateGanhou;
        desenhos.remove(nave);
        desenhos.remove(aliens);
    }
    //</editor-fold>

    //Atualiza os elementos funcionais do jogo. Para o stateIntro e stateRecorde, basta alterar a música.
    public void update() throws JavaLayerException, InterruptedException {
        switch (state) {
            case stateIntro:
                //<editor-fold defaultstate="collapsed" desc="Músicas">
                if (!player.isPlaying()) {
                    player.play("Musicas/Intro.mp3");
                } else {
                    if (!player.getFilename().equals("Musicas/Intro.mp3")) {
                        player.stop();
                    }
                }
                //</editor-fold>
                break;

            case stateJogo:
                //<editor-fold defaultstate="collapsed" desc="Músicas">
                if (!player.isPlaying()) {
                    player.play("Musicas/Campo.mp3");
                } else {
                    if (!player.getFilename().equals("Musicas/Campo.mp3")) {
                        player.stop();
                    }
                }
                //</editor-fold>
                //Atualiza os personagens do jogo
                if(!paused){
                    nave.update();
                    aliens.update();
                }
                break;

            case stateRecorde:
                //<editor-fold defaultstate="collapsed" desc="Músicas">
                if (!player.isPlaying()) {
                    player.play("Musicas/Intro.mp3");
                } else {
                    if (!player.getFilename().equals("Musicas/Intro.mp3")) {
                        player.stop();
                    }
                }
                //</editor-fold>
                break;
                
            case stateGanhou:
                //<editor-fold defaultstate="collapsed" desc="Músicas">
                if (!player.isPlaying()) {
                    player.play("Musicas/Vitoria.mp3");
                } else {
                    if (!player.getFilename().equals("Musicas/Vitoria.mp3")) {
                        player.stop();
                        player.play("Musicas/Vitoria.mp3");
                    }
                }
                if(pontos > 8000 && !oitomiltocou){
                    oitomil.play("Musicas/8000.mp3");
                    oitomiltocou = true;
                }
                //</editor-fold>
                //Verifica se o usuário conseguiu uma pontuação recorde
                if(!preencheu){
                    graficos.checarRecorde(pontos);
                    preencheu = true;
                }
                break;
                
            case statePerdeu:
                //<editor-fold defaultstate="collapsed" desc="Músicas">
                if (!player.isPlaying()) {
                    player.play("Musicas/Gameover.mp3");
                } else {
                    if (!player.getFilename().equals("Musicas/Gameover.mp3")) {
                        player.stop();
                        player.play("Musicas/Gameover.mp3");
                    }
                }
                if(pontos > 8000 && !oitomiltocou){
                    oitomil.play("Musicas/8000.mp3");
                    oitomiltocou = true;
                }
                //</editor-fold>
                
                if(!preencheu){
                    graficos.checarRecorde(pontos);
                    preencheu = true;
                }
                break;
                
        }
        graficos.repaint();
    }

    public int getState(){
        return state;
    }
    
    public Nave getNave(){
        return nave;
    }
    
    public void setPaused(boolean paused){
        this.paused = paused;
    }
    
    public boolean getPaused(){
        return paused;
    }
    
    public int getPontos(){
        return pontos;
    }
    
    public void aumentaPontos(int pontos){
        this.pontos += pontos;
    }

    public int getVidas(){
        return nave.getVidas();
    }
    
    public Graficos getGraf(){
        return graficos;
    }
}
